<!DOCTYPE html>
<!--[if IEMobile 7 ]><html class="no-js iem7"><![endif]-->
<!--[if lt IE 9]><html class="no-js lte-ie8"><![endif]-->
<!--[if (gt IE 8)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js" lang="en"><!--<![endif]-->
<head>
  <meta charset="utf-8">
  <title>[轉] SPI,UART,I2C都有什麼區別，及其各自的特點</title>
  <meta name="author" content="Jason">



  <!-- http://t.co/dKP3o1e -->
  <meta name="HandheldFriendly" content="True">
  <meta name="MobileOptimized" content="320">
  <meta name="viewport" content="width=device-width, initial-scale=1">

  <link href="./favicon.png" rel="icon">
  <link href="./theme/css/main.css" media="screen, projection"
        rel="stylesheet" type="text/css">
  <script src="./theme/js/modernizr-2.0.js"></script>
  <script src="./theme/js/ender.js"></script>
  <script src="./theme/js/octopress.js" type="text/javascript"></script>

  <link href="http://fonts.googleapis.com/css?family=PT+Serif:regular,italic,bold,bolditalic"
        rel="stylesheet" type="text/css">
  <link href="http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic"
        rel="stylesheet" type="text/css">
</head>

<body>
  <header role="banner"><hgroup>
  <h1><a href="./">Jason Blog</a></h1>
</hgroup></header>
  <nav role="navigation"><ul class="subscription" data-subscription="rss">
</ul>



<ul class="main-navigation">
    <li >
    <a href="./category/c.html">C</a>
    </li>
    <li >
    <a href="./category/gdb.html">Gdb</a>
    </li>
    <li >
    <a href="./category/github.html">Github</a>
    </li>
    <li >
    <a href="./category/glib.html">Glib</a>
    </li>
    <li >
    <a href="./category/opencv.html">Opencv</a>
    </li>
    <li >
    <a href="./category/pelican.html">Pelican</a>
    </li>
    <li >
    <a href="./category/protocol.html">Protocol</a>
    </li>
    <li >
    <a href="./category/python.html">Python</a>
    </li>
    <li >
    <a href="./category/regular.html">Regular</a>
    </li>
    <li class="active">
    <a href="./category/sed.html">Sed</a>
    </li>
    <li >
    <a href="./category/stock.html">Stock</a>
    </li>
</ul></nav>
  <div id="main">
    <div id="content">
<div>
  <article class="hentry" role="article">
<header>
      <h1 class="entry-title">[轉] SPI,UART,I2C都有什麼區別，及其各自的特點</h1>
      <p class="meta"><time datetime="2014-10-10T13:50:49" pubdate>五 10 十月 2014</time></p>
</header>

  <div class="entry-content"><p>區別:
SPI：高速同步串列口。3～4線介面，收發獨立、可同步進行
UART：通用非同步串列口。按照標準串列傳輸速率完成雙向通訊，速度慢
I2C:一種序列傳輸方式,三線制,網上可找到其通信協議和用法的</p>
<p>3根線實現資料雙向傳輸
串列週邊介面 Serial peripheral interface
UART:通用非同步收發器
UART是用於控制電腦與串列設備的晶片。有一點要注意的是，它提供了RS-232C資料終端設備介面，這樣電腦就可以和數據機或其它使用RS-232C介面的串列設備通信了。作為介面的一部分，UART還提供以下功能：
將由電腦內部傳送過來的並行資料轉換為輸出的串列資料流程。將電腦外部來的串列資料轉換為位元組，供電腦內部使用並行資料的器件使用。在輸出的串列資料流程中加入同位檢查位元，並對從外部接收的資料流程進行同位。在輸出資料流程中加入啟停標記，並從接收資料流程中刪除啟停標記。處理由鍵盤或滑鼠發出的中斷信號（鍵盤和鼠票也是串列設備）。可以處理電腦與外部串列設備的同步管理問題。有一些比較高檔的UART還提供輸入輸出資料的緩衝區，現在比較新的UART是16550，它可以在電腦需要處理資料前在其緩衝區內存儲16位元組資料，而通常的UART是8250。現在如果您購買一個內置的數據機，此數據機內部通常就會有16550 UART。
I2C:能用於替代標準的平行匯流排，能連接的各種積體電路和功能模組。I2C是多主控匯流排，所以任何一個設備都能像主控器一樣工作，並控制匯流排。 匯流排上每一個設備都有一個獨一無二的位址，根據設備它們自己的能力，它們可以作為發射器或接收器工作。多路微控制器能在同一個I2C匯流排上共存。</p>
<p>更詳細的區別：
第一個區別當然是名字：
     SPI(Serial Peripheral Interface：串列外設介面);
     I2C(INTER IC BUS：意為IC之間匯流排)
     UART(Universal Asynchronous Receiver Transmitter：通用非同步收發器)
第二，區別在電氣信號線上：
     SPI匯流排由三條信號線組成：串列時鐘(SCLK)、串列資料輸出(SDO)、串列資料登錄(SDI)。SPI匯流排可以實現 多個SPI設備互相連接。提供SPI串列時鐘的SPI設備為SPI主機或主設備(Master)，其他設備為SPI從機或從設備(Slave)。主從設備間可以實現全雙工通信，當有多個從設備時，還可以增加一條從設備選擇線。
     如果用通用IO口類比SPI匯流排，必須要有一個輸出口(SDO)，一個輸入口(SDI)，另一個口則視實現的設備類型而定，如果要實現主從設備，則需輸入輸出口，若只實現主設備，則需輸出口即可，若只實現從設備，則只需輸入口即可。</p>
<div class="highlight"><pre> <span class="n">I2C</span><span class="err">匯流排是雙向、兩線</span><span class="p">(</span><span class="n">SCL</span><span class="err">、</span><span class="n">SDA</span><span class="p">)</span><span class="err">、串列、多主控（</span><span class="n">multi</span><span class="o">-</span><span class="n">master</span><span class="err">）介面標準，具有匯流排仲裁機制，非常適合在器件之間進行近距離、非經常性的資料通信。在它的協定體系中，傳輸資料時都會帶上目的設備的設備位址，因此可以實現設備組網。</span>
 <span class="err">如果用通用</span><span class="n">IO</span><span class="err">口類比</span><span class="n">I2C</span><span class="err">匯流排，並實現雙向傳輸，則需一個輸入輸出口</span><span class="p">(</span><span class="n">SDA</span><span class="p">)</span><span class="err">，另外還需一個輸出口</span><span class="p">(</span><span class="n">SCL</span><span class="p">)</span><span class="err">。（注：</span><span class="n">I2C</span><span class="err">資料瞭解得比較少，這裡的描述可能很不完備）</span>

 <span class="n">UART</span><span class="err">匯流排是非同步串口，因此一般比前兩種同步串口的結構要複雜很多，一般由串列傳輸速率產生器</span><span class="p">(</span><span class="err">產生的串列傳輸速率等於傳輸串列傳輸速率的</span><span class="mi">16</span><span class="err">倍</span><span class="p">)</span><span class="err">、</span><span class="n">UART</span><span class="err">接收器、</span><span class="n">UART</span><span class="err">發送器組成，硬體上由兩根線，一根用於發送，一根用於接收。</span>
 <span class="err">顯然，如果用通用</span><span class="n">IO</span><span class="err">口類比</span><span class="n">UART</span><span class="err">匯流排，則需一個輸入口，一個輸出口。</span>
</pre></div>


<p>第三，從第二點明顯可以看出，SPI和UART可以實現全雙工，但I2C不行；</p>
<p>第四，看看牛人們的意見吧！
     wudanyu：I2C線更少，我覺得比UART、SPI更為強大，但是技術上也更加麻煩些，因為I2C需要有雙向IO的支援，而且使用上拉電阻，我覺得抗干擾能力較弱，一般用於同一板卡上晶片之間的通信，較少用於遠距離通信。SPI實現要簡單一些，UART需要固定的串列傳輸速率，就是說兩位元資料的間隔要相等，而SPI則無所謂，因為它是有時鐘的協定。
     quickmouse：I2C的速度比SPI慢一點，協議比SPI複雜一點，但是連線也比標準的SPI要少。
SPI、I2C、UART三種串列匯流排協定的區別
     SPI(Serial Peripheral Interface：串列外設介面)
     I2C(INTER IC BUS)
     UART(Universal Asynchronous Receiver Transmitter：通用非同步收發器)</p>
<p>[ SPI ] 
The SPI includes these distinctive features:
   Master mode and slave mode
   Bi-directional mode
   Slave select output
   Mode fault error flag with CPU interrupt capability
   Double-buffered data register
   Serial clock with programmable polarity and phase
    Control of SPI operation during wait mode</p>
<p>SPI 有兩種模式，Normal Mode and Bidirectional Mode，包括以下幾根線：
SS      Slave Select
SCK    Serial Clock
MOSI Master Output, Slave Input
MISO Master Input, Slave Output</p>
<p>MOMI Master Output, Master Input
SISO   Slave Input, Slave Output</p>
<p>其中前四根線用於Normal Mode ，常用的也是4根線的Normal Mode 。 
MOSI
This pin is used to transmit data out of the SPI module when it is configured as a Master and receive data
when it is configured as Slave.
MISO
This pin is used to transmit data out of the SPI module when it is configured as a Slave and receive data
when it is configured as Master.
SS
This pin is used to output the select signal from the SPI module to another peripheral with which a data
transfer is to take place when its configured as a Masterand its used as an input to receive the slave select
signal when the SPI is configured as Slave.
SCK
This pin is used to output the clock with respect to which the SPI transfers data or receive clock in case of
Slave.</p>
<p>SPI 是一種允許一個主設備啟動一個與從設備的同步通訊的協定，從而完成資料的交換。也就是SPI是一種規定好的通訊方式。這種通信方式的優點是佔用埠較少，一般4根就夠基本通訊了。同時傳送速率也很高。一般來說要求主設備要有SPI控制器（但可用類比方式），就可以與基於SPI的晶片通訊了。
    SPI 的通信原理很簡單，它需要至少4根線，事實上3根也可以。也是所有基於SPI的設備共有的，它們是SDI（資料登錄），SDO（資料輸出），SCK（時 鐘），CS（片選）。其中CS是控制晶片是否被選中的，也就是說只有片選信號為預先規定的使能信號時（高電位或低電位），對此晶片的操作才有效。這就允許 在同一匯流排上連接多個SPI設備成為可能。
     接下來就負責通訊的3根線了。通訊是通過資料交換完成的，這裡先要知道SPI是串列通訊協定，也就是說資料是一位元一位元的傳輸的。這就是SCK時鐘線存在的原 因，由SCK提供時鐘脈衝，SDI，SDO則基於此脈衝完成資料傳輸。資料輸出通過SDO線，資料在時鐘上沿或下沿時改變，在緊接著的下沿或上沿被讀取。 完成一位資料傳輸，輸入也使用同樣原理。這樣，在至少8次時鐘信號的改變（上沿和下沿為一次），就可以完成8位元資料的傳輸。
     要注意的是，SCK信號線只由主設備控制，從設備不能控制信號線。同樣，在一個基於SPI的設備中，至少有一個主控設備。
     這樣傳輸的特點：這樣的傳輸方式有一個優點，與普通的串列通訊不同，普通的串列通訊一次連續傳送至少8位元資料，而SPI允許資料一位元一位元的傳送，甚至允許暫停，因為SCK時鐘線由主控設備控制，當沒有時鐘跳變時，從設備不採集或傳送資料。也就是說，主設備通過對SCK時鐘線的控制可以完成對通訊的控制。
     SPI還是一個資料交換協議：因為SPI的資料登錄和輸出線獨立，所以允許同時完成資料的輸入和輸出。
     不同的SPI設備的實現方式不盡相同，主要是資料改變和採集的時間不同，在時鐘信號上沿或下沿採集有不同定義，具體請參考相關器件的文檔。</p>
<p>[I2C] 
    只要求兩條匯流排線路：一條串列資料線SDA 一條串列時鐘線SCL
    每個連接到匯流排的器件都可以通過唯一的位址和一直存在的簡單的主機從機關係軟體設定位址主機可以作為主機發送器或主機接收器
    它是一個真正的多主機匯流排如果兩個或更多主機同時初始化資料傳輸可以通過衝突檢測和仲裁，防止資料被破壞
    串列的8 位元雙向資料傳輸位元速率在標準模式下可達100kbit/s 快速模式下可達400kbit/s 高速模式下可達3.4Mbit/s
    片上的濾波器可以濾去匯流排資料線上的毛刺波保證資料完整
    連接到相同匯流排的IC 數量只受到匯流排的最大電容400pF 限制</p>
<p>[UART ]
UART匯流排是非同步串口，因此一般比前兩種同步串口的結構要複雜很多，一般由串列傳輸速率產生器(產生的串列傳輸速率等於傳輸串列傳輸速率的16倍)、UART接收器、UART發送器組成，硬體上由兩根線，一根用於發送，一根用於接收。
     顯然，如果用通用IO口類比UART匯流排，則需一個輸入口，一個輸出口。
UART常用於控制電腦與串列設備的晶片。有一點要注意的是，它提供了RS-232C資料終端設備介面，這樣電腦就可以和數據機或其它使用RS-232C介面的串列設備通信了。
明顯可以看出，SPI和UART可以實現全雙工，但I2C不行</p></div>
    <footer>
<p class="meta">
  <span class="byline author vcard">
    Posted by <span class="fn">Jason</span>
  </span>
<time datetime="2014-10-10T13:50:49" pubdate>五 10 十月 2014</time>  <span class="categories">
    <a class="category" href="./tag/protocl.html">Protocl</a>
  </span>
</p><div class="sharing">
</div>    </footer>
  </article>

</div>
<aside class="sidebar">
  <section>
    <h1>Recent Posts</h1>
    <ul id="recent_posts">
      <li class="post">
          <a href="./glib-bian-yi-an-zhuang.html">Glib 編譯& 安裝</a>
      </li>
      <li class="post">
          <a href="./gdb-bian-yi-an-zhuang.html">GDB 編譯＆安裝</a>
      </li>
      <li class="post">
          <a href="./zhuan-spiuarti2cdu-you-shi-mo-qu-bie-ji-qi-ge-zi-de-te-dian.html">[轉] SPI,UART,I2C都有什麼區別，及其各自的特點</a>
      </li>
      <li class="post">
          <a href="./zhuan-ben-yi-bi-per-gu-jia-jing-zhi-bi-pbr-gu-dong-quan-yi-bao-chou-lu-roe.html">[轉] 本益比(PER)、股價淨值比(PBR)、股東權益報酬率(ROE)</a>
      </li>
      <li class="post">
          <a href="./search-struct-or-class-prototype.html">search struct or class prototype</a>
      </li>
    </ul>
  </section>
  <section>
      
    <h1>Categories</h1>
    <ul id="recent_posts">
        <li><a href="./category/c.html">C</a></li>
        <li><a href="./category/gdb.html">GDB</a></li>
        <li><a href="./category/github.html">github</a></li>
        <li><a href="./category/glib.html">Glib</a></li>
        <li><a href="./category/opencv.html">opencv</a></li>
        <li><a href="./category/pelican.html">Pelican</a></li>
        <li><a href="./category/protocol.html">protocol</a></li>
        <li><a href="./category/python.html">Python</a></li>
        <li><a href="./category/regular.html">regular</a></li>
        <li><a href="./category/sed.html">sed</a></li>
        <li><a href="./category/stock.html">stock</a></li>
    </ul>
  </section>
 

  <section>
  <h1>Tags</h1>
    <a href="./tag/glib.html">Glib</a>,    <a href="./tag/pelican.html">Pelican</a>,    <a href="./tag/c.html">C</a>,    <a href="./tag/github.html">github</a>,    <a href="./tag/sed.html">sed</a>,    <a href="./tag/python.html">python</a>,    <a href="./tag/protocl.html">Protocl</a>,    <a href="./tag/opencv.html">opencv</a>,    <a href="./tag/gdb.html">gdb</a>,    <a href="./tag/regular.html">regular</a>,    <a href="./tag/protocol.html">protocol</a>,    <a href="./tag/stock.html">stock</a>  </section>


    <section>
        <h1>Social</h1>
        <ul>
            <li><a href="#" target="_blank">You can add links in your config file</a></li>
            <li><a href="#" target="_blank">Another social link</a></li>
        </ul>
    </section>
    <section>
        <h1>Blogroll</h1>
        <ul>
            <li><a href="http://getpelican.com/" target="_blank">Pelican</a></li>
            <li><a href="http://python.org/" target="_blank">Python.org</a></li>
            <li><a href="http://jinja.pocoo.org/" target="_blank">Jinja2</a></li>
            <li><a href="#" target="_blank">You can modify those links in your config file</a></li>
        </ul>
    </section>

</aside>    </div>
  </div>
  <footer role="contentinfo"><p>
  Copyright &copy; 2013 - Jason -
  <span class="credit">Powered by <a href="http://getpelican.com">Pelican</a></span>
</p></footer>
</body>
</html>